package main

import "fmt"

/*
main 函数演示Go语言基础变量声明与初始化
主要包含以下示例：
- 不同数据类型的变量声明方式
- 多变量同时赋值
- 默认值初始化
- 类型推断特性
*/
func main() {
	// sting类型变量
	var a string = "hello"
	var b, c string = "b", "c"
	var d string // 默认为空字符串
	fmt.Println(a, b, c, d)

	// int 类型变量
	var int_a int = 1
	var int_b, int_c int = 2, 3
	var int_d int // 默认为0
	fmt.Println(int_a, int_b, int_c, int_d)

	// bool类型变量
	var bool_a bool = true
	var bool_b bool // 默认为false
	fmt.Println(bool_a, bool_b)

	// 其他默认值
	var obj_a *int           // <nil>
	var obj_b []int          // []
	var obj_c map[string]int // map[]
	var obj_d chan int       // <nil>
	var obj_e func(int) int  // <nil>
	var obj_f interface{}    //<nil>

	fmt.Println(obj_a, obj_b, obj_c, obj_d, obj_e, obj_f)

	// 根据类型自行判定变量类型
	var x = "hello"
	fmt.Println(x)
	// 声明过的变量，不能再用 := 再次声明
	// x := "hello"  // 这是错误的
	/*
		x := "hello"
		// 等价于
		var x int = "hello"
	*/
	y := "world"
	fmt.Println(x + y)

	m, n, q := 1, 2, 3
	fmt.Println(m, n, q)

	// 因式分解法，这种写法一般用于声明全局变量
	var (
		yin_a int    = 1
		yin_b string = "2"
	)
	fmt.Println(yin_a, yin_b)

	// 值类型和引用类型
	var doller_a int = 1
	var doller_b int
	doller_b = doller_a
	fmt.Print(&doller_a, &doller_b)

}
